/**
 * 文件名：@AbstractInterceptor.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.interceptor <br/>
 * 项目名：afw-mvc-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import cn.efunbox.afw.core.AfwContext;
import cn.efunbox.afw.core.mvc.EmptyHandlerInfo;
import cn.efunbox.afw.core.mvc.HandlerInfo;
import cn.efunbox.afw.core.mvc.context.Context;
import cn.efunbox.afw.core.resolver.HandlerInfoResolver;

/**
 * 类名：AbstractInterceptor  <br />
 *
 * 功能：拦截器基础实现
 *
 * @author xtwin <br />
 * 创建时间：2015年12月2日 下午6:28:37  <br />
 * @version 2015年12月2日
 */
public abstract class AbstractInterceptor extends HandlerInterceptorAdapter {
	
	// HandlerInfo解析器
	protected HandlerInfoResolver handlerInfoResolver;
	
	// 默认空handler
	private HandlerInfo handlerInfo = EmptyHandlerInfo.getInstance();

	/**
	 * 功能: 规范前置处理器，提取当前的上下文对象供子类使用 <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月2日 下午6:29:31<br/>
	 * 
	 * @param request
	 * @param response
	 * @param handler
	 * @return
	 * @throws Exception <br/>
	 * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
	 */
	@Override
	public final boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		
		// 调用子类实现逻辑
		doPreHandle(AfwContext.getContext(), handler);
		
		return true;
	}
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月2日 下午7:08:59<br/>
	 * 
	 * @param request
	 * @param response
	 * @param handler
	 * @param modelAndView
	 * @throws Exception <br/>
	 * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#postHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.web.servlet.ModelAndView)
	 */
	@Override
	public final void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		// 调用子类实现逻辑
		doPostHandle(AfwContext.getContext(), handler);
	}

	/**
	 * 功能：由子类实现前置处理逻辑 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:30:17 <br/>
	 */
	protected void doPreHandle(Context context, Object handler) throws Exception {
		// 默认空实现
	}
	
	/**
	 * 功能：由子类实现后置处理逻辑 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月3日 上午11:29:10 <br/>
	 */
	protected void doPostHandle(Context context, Object handler) throws Exception {
		// 默认空实现
	}
	
	/**
	 * 
	 * 功能：解析处理器信息对象 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月9日 下午1:39:11 <br/>
	 */
	protected HandlerInfo resolveHandlerInfo(Context context, Object handler) throws Exception {
		HandlerInfo info = handlerInfoResolver.resolve(handler);
		
		if (null == info) {
			// 使用默认
			info = handlerInfo;
		}
		
		return info;
	}

	/**
	 * @version 2015年12月9日-下午1:37:51
	 */
	public void setHandlerInfoResolver(HandlerInfoResolver handlerInfoResolver) {
		this.handlerInfoResolver = handlerInfoResolver;
	}

	/**
	 * @version 2015年12月14日-上午11:30:50
	 */
	public void setHandlerInfo(HandlerInfo handlerInfo) {
		this.handlerInfo = handlerInfo;
	}
}
